package backtracking.leetcode.medium;

import java.util.ArrayList;
import java.util.List;

/**
 * @author bruin_du
 * @description 含有 k 个元素的组合
 * @date 2022/9/4 23:48
 **/
public class OfferII080_Combine {
    List<List<Integer>> lists = new ArrayList<>();
    List<Integer> list = new ArrayList<>();
    public List<List<Integer>> combine(int n, int k) {
        recursion(n, k, 1);
        return lists;
    }

    private void recursion(int n, int k, int num) {
        // 剪枝：temp 长度加上区间 [cur, n] 的长度小于 k，不可能构造出长度为 k 的 temp
        if (list.size() + (n - num + 1) < k) {
            return;
        }
        // 记录合法的答案
        if (list.size() == k) {
            lists.add(new ArrayList<Integer>(list));
            return;
        }
        if (num <= n) {
            // 考虑选择当前位置
            list.add(num);
            recursion(n, k, num + 1);
            // 考虑不选择当前位置
            list.remove(list.size() - 1);
            recursion(n, k, num + 1);
        }
    }
}
